/**
 * 会话级缓存对象，用于在会话存储中存取数据
 */
const sessionCache = {
  /**
   * 设置会话存储中的项
   * @param {string} key - 要设置的项的键名
   * @param {string} value - 要设置的项的键值
   */
  set (key, value) {
    if (!sessionStorage) {
      return
    }
    if (key != null && value != null) {
      sessionStorage.setItem(key, value)
    }
  },
  /**
   * 获取会话存储中的项
   * @param {string} key - 要获取的项的键名
   * @returns {string|null} - 返回该项的键值，如果该项不存在则返回null
   */
  get (key) {
    if (!sessionStorage) {
      return null
    }
    if (key == null) {
      return null
    }
    return sessionStorage.getItem(key)
  },
  /**
   * 设置会话存储中的JSON数据
   * @param {string} key - 要设置的项的键名
   * @param {object} jsonValue - 要设置的项的JSON键值
   */
  setJSON (key, jsonValue) {
    if (jsonValue != null) {
      this.set(key, JSON.stringify(jsonValue))
    }
  },
  /**
   * 获取会话存储中的JSON数据
   * @param {string} key - 要获取的项的键名
   * @returns {object|null} - 返回该项的JSON键值，如果该项不存在则返回null
   */
  getJSON (key) {
    const value = this.get(key)
    if (value != null) {
      return JSON.parse(value)
    }
  },
  /**
   * 从会话存储中移除项
   * @param {string} key - 要移除的项的键名
   */
  remove (key) {
    sessionStorage.removeItem(key);
  }
}
/**
 * 本地缓存对象，用于在本地存储中存取数据
 */
const localCache = {
  /**
   * 设置本地存储中的项
   * @param {string} key - 要设置的项的键名
   * @param {string} value - 要设置的项的键值
   */
  set (key, value) {
    if (!localStorage) {
      return
    }
    if (key != null && value != null) {
      localStorage.setItem(key, value)
    }
  },
  /**
   * 获取本地存储中的项
   * @param {string} key - 要获取的项的键名
   * @returns {string|null} - 返回该项的键值，如果该项不存在则返回null
   */
  get (key) {
    if (!localStorage) {
      return null
    }
    if (key == null) {
      return null
    }
    return localStorage.getItem(key)
  },
  /**
   * 设置本地存储中的JSON数据
   * @param {string} key - 要设置的项的键名
   * @param {object} jsonValue - 要设置的项的JSON键值
   */
  setJSON (key, jsonValue) {
    if (jsonValue != null) {
      this.set(key, JSON.stringify(jsonValue))
    }
  },
  /**
   * 获取本地存储中的JSON数据
   * @param {string} key - 要获取的项的键名
   * @returns {object|null} - 返回该项的JSON键值，如果该项不存在则返回null
   */
  getJSON (key) {
    const value = this.get(key)
    if (value != null) {
      return JSON.parse(value)
    }
  },
  /**
   * 从本地存储中移除项
   * @param {string} key - 要移除的项的键名
   */
  remove (key) {
    localStorage.removeItem(key);
  }
}

/**
 * 导出缓存对象，包含会话级和本地两级缓存
 */
export default {
  /**
   * 会话级缓存
   */
  session: sessionCache,
  /**
   * 本地缓存
   */
  local: localCache
}